from rest_framework import permissions

from apps.chefs.models import DjChef
from .models import DjChefOrder, Order

class IsOrderOwnerOrChef(permissions.BasePermission):
    """
    检查用户是否是订单的所有者、相关厨师或管理员
    增强安全性和错误处理
    """
    def has_object_permission(self, request, view, obj):
        # 确保用户已认证
        if not request.user.is_authenticated:
            return False
            
        # 管理员有全部权限
        if request.user.is_staff:
            return True
            
        # 检查是否是订单所有者
        if hasattr(obj, 'customer') and obj.customer == request.user:
            return True
            
        # 检查是否是相关厨师（确保用户有chef_profile属性）
        if (hasattr(request.user, 'chef_profile') and 
            hasattr(obj, 'chef') and 
            obj.chef == request.user.chef_profile):
            return True
            
        return False

class IsConsumerMiniProgram(permissions.BasePermission):
    """
    增强版消费者小程序检查
    添加请求头验证和更严格的安全检查
    """
    def has_permission(self, request, view):
        # 安全方法总是允许
        if request.method in permissions.SAFE_METHODS:
            return True
            
        # 从请求头获取小程序类型
        app_type = request.META.get('HTTP_X_APP_TYPE')
        
        # 验证请求头存在且值为consumer
        return app_type == 'consumer'

class IsProviderMiniProgram(permissions.BasePermission):
    """
    增强版服务者小程序检查
    修复逻辑错误并添加验证
    """
    def has_permission(self, request, view):
        # 安全方法总是允许
        if request.method in permissions.SAFE_METHODS:
            return True
            
        # 从请求头获取小程序类型
        app_type = request.META.get('HTTP_X_APP_TYPE')
        
        # 验证请求头存在且值为provider
        return app_type == 'provider'

class IsOrderInEditableState(permissions.BasePermission):
    """
    新增：检查订单是否处于可编辑状态
    """
    editable_statuses = ['pending', 'paid']
    
    def has_object_permission(self, request, view, obj):
        return obj.status in self.editable_statuses

class IsChefOwner(permissions.BasePermission):
    """
    验证当前登录用户关联的 DjChef 是订单的所属厨师
    """
    def has_object_permission(self, request, view, obj):
        # 确保对象是 DjChefOrder 实例
        if not isinstance(obj, DjChefOrder):
            return False
        
        try:
            # 获取当前登录用户关联的 DjChef（直接使用 chefs 应用模型）
            current_chef = DjChef.objects.get(user=request.user)
        except DjChef.DoesNotExist:
            return False  # 非厨师用户无权访问
        
        # 验证订单的 chef 字段与当前厨师一致
        return obj.chef == current_chef